package baseUserModel

import (
	"github.com/mitchellh/mapstructure"
	"github.com/spf13/cast"
	"learn/app/models/cm"
	"learn/pkg/hepler"
	"learn/pkg/logger"
)

type User struct {
	cm.BaseModel `mapstructure:",squash"`
	Account      string `gorm:"account" json:"account"`                           // 账号
	Pwd          string `gorm:"pwd" json:"pwd"`                                   // 密码
	Status       int8   `gorm:"status" json:"status"`                             // 用户状态：1 正常，2 删除
	NickName     string `gorm:"nick_name" json:"nick_name"`                       // 昵称
	RoleIds      string `gorm:"role_ids" json:"role_ids" mapstructure:"role_ids"` // 角色
	cm.CommonTimestampsField
}

// TableName 表名称
func (obj *User) TableName() string {
	return "learn_admin"
}

func (obj *User) Add(input map[string]interface{}) uint64 {
	user := User{}
	if err := mapstructure.Decode(input, &user); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	res := obj.Db().Create(&user)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return user.ID
}

func (obj *User) List(input map[string]interface{}) ([]map[string]interface{}, int64) {
	userList := []User{} // 不用结构体。无法使用自定义类型

	var count int64

	db := obj.Db()

	if hepler.Empty(input["id"]) == false {
		db.Where("id = ?", input["id"])
	}

	if hepler.Empty(input["account"]) == false {
		db.Where("account like ?", "%"+cast.ToString(input["account"])+"%")
	}

	res := db.Model(User{}).Find(&userList).Count(&count)

	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
	}

	return obj.StructSliceToMapSlice(userList), count
}

func (obj *User) Update(input map[string]interface{}) uint64 {
	user := User{}
	if err := mapstructure.Decode(input, &user); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}

	db := obj.Db()
	if hepler.Empty(user.ID) == false {
		db = db.Where("id", user.ID)
	} else {
		return 0
	}

	res := db.Updates(&user)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return user.ID
}

func (obj *User) Del(input map[string]interface{}) bool {
	user := User{}
	if err := mapstructure.Decode(input, &user); err != nil {
		logger.Error("db Err" + err.Error())
		return false
	}

	db := obj.Db()
	if hepler.Empty(user.ID) == false {
		db = db.Where("id", user.ID)
	} else {
		return false
	}

	res := db.Delete(&user)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return false
	}
	return true
}

func (obj *User) Find(input map[string]interface{}) map[string]interface{} {
	user := User{}
	if err := mapstructure.Decode(input, &user); err != nil {
		logger.Error("db Err" + err.Error())
		return nil
	}

	db := obj.Db()
	res := db.Find(&user)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return nil
	}
	return obj.StructToMap(user)
}
